%% OBJECTIVE FUNCTION IN OPTIMAL CONTRACT
function o = optimal_fun(z, x, y, v, vy_f, vy_b, vy_c, vx_c, vyy, vxx, vxy,params)
%% parameters
temp = num2cell(params);
[rho, r, ra, alpha, sigma, lambda, M, eta_min, eta_max] = temp{:};

%% Objective function
C = z(:,1);
B = z(:,2);
Eta = z(:,3);

ExRet = alpha + sigma*Eta*x;

o = C - ExRet.*B./(sigma*lambda).*C.^rho + y*x*Eta.*B ...
            + v*( ra - C.^(1-rho)./(1-rho) + 0.5*rho*B.^2) ...
            + vy_f*max(0,...
                ( (1-x)*ExRet.*Eta.*C.^rho./(sigma*lambda) +...
                    y*(r-ra + rho/(1-rho)*C.^(1-rho) + 0.5*rho*B.^2 ) +...
                    rho*y*x*Eta.*B))...
            + vy_b*min(0,...
                ( (1-x)*ExRet.*Eta.*C.^rho./(sigma*lambda) +...
                    y*(r-ra + rho/(1-rho)*C.^(1-rho) + 0.5*rho*B.^2 ) +...
                    rho*y*x*Eta.*B) )...
            + vy_c*(- rho*B*y - x*y*Eta).*B +...
            + vx_c *x*(1-x)*Eta.*B...
            + 0.5*vyy*(-rho*y*B - x*y*Eta).^2 ...
            + 0.5*vxx*(x*(1-x))^2*(Eta).^2 ...
            + vxy*x*(1-x)*Eta.*(-rho*y*B - x*y*Eta);

end